#include<iostream>
using namespace std;
#include<vector>

//让我们一起来玩扫雷游戏！
//
//给你一个大小为 m x n 二维字符矩阵 board ，表示扫雷游戏的盘面，其中：
//
//'M' 代表一个 未挖出的 地雷，
//'E' 代表一个 未挖出的 空方块，
//'B' 代表没有相邻（上，下，左，右，和所有4个对角线）地雷的 已挖出的 空白方块，
//数字（'1' 到 '8'）表示有多少地雷与这块 已挖出的 方块相邻，
//'X' 则表示一个 已挖出的 地雷。
//给你一个整数数组 click ，其中 click = [clickr, clickc] 表示在所有 未挖出的 方块（'M' 或者 'E'）中的下一个点击位置（clickr 是行下标，clickc 是列下标）。
//
//根据以下规则，返回相应位置被点击后对应的盘面：
//
//如果一个地雷（'M'）被挖出，游戏就结束了- 把它改为 'X' 。
//如果一个 没有相邻地雷 的空方块（'E'）被挖出，修改它为（'B'），并且所有和其相邻的 未挖出 方块都应该被递归地揭露。
//如果一个 至少与一个地雷相邻 的空方块（'E'）被挖出，修改它为数字（'1' 到 '8' ），表示相邻地雷的数量。
//如果在此次点击中，若无更多方块可被揭露，则返回盘面。

class Solution
{
public:
    vector<vector<bool>>check;
    int num_mine(vector<vector<char>>&board,int row,int col)
    {
        int num=0;
        for(int i=row-1;i<=row+1;++i)
        {
            for(int j=col-1;j<=col+1;++j)
            {
                if(i>=0&&i<board.size()&&j>=0&&j<board[0].size())
                {
                    if(board[i][j]=='M')
                    {
                        num+=1;
                    }
                }
            }
        }

        return num;
    }

    void dfs(vector<vector<char>>&board,int row ,int col)
    {                                                                                                                                               
       if (row < 0 || col < 0 || row >= board.size() || col >= board[0].size() || check[row][col]) 
       {
            return;
        }
        // 标记当前单元格为已访问
        check[row][col] = true;
        char num=num_mine(board,row,col)+'0';
        if(num!='0')
        {
           board[row][col]=num;
        }
        else
        {
            board[row][col]='B';
             for (int i = row - 1; i <= row + 1; ++i)
            {
                for (int j = col - 1; j <= col + 1; ++j)
                 {
                    if (i == row && j == col)
                    {
                        continue;
                     }// 跳过当前单元格
                    dfs(board, i, j);
                }
            }
        }

      
    }
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click)
    {
        check=vector<vector<bool>>(board.size(), vector<bool>(board[0].size(), false));
        if(board[click[0]][click[1]]=='M')
        {
            board[click[0]][click[1]]='X';
        }
        else
        {
            dfs(board,click[0],click[1]);
        }

        return board;
    }
 };

